/*
 【基础】排座椅
  题目描述
    上课的时候总会有一些同学和前后左右的人交头接耳，这是令小学班主任十分头疼的一件事情。
    不过，班主任小雪发现了一些有趣的现象，当同学们的座次确定下来之后，只有有限的D对同学上课时会交头接耳。
    同学们在教室中坐成了 M 行 N 列，坐在第 i 行第 j 列的同学的位置是（i, j），
    为了方便同学们进出，在教室中设置了 K 条横向的通道，L 条纵向的通道。
    于是，聪明的小雪想到了一个办法，或许可以减少上课时学生交头接耳的问题：
      她打算重新摆放桌椅，改变同学们桌椅间通道的位置，
      因为如果一条通道隔开了两个会交头接耳的同学，那么他们就不会交头接耳了。

    请你帮忙给小雪编写一个程序，给出最好的通道划分方案。
    在该方案下，上课时交头接耳的学生的对数最少。
  输入
    输入文件 seat.in 的第一行，有 5 个用空格隔开的整数，分别是 M，N，K，L，D
      （2 <= N，M <= 1000，0 <= K < M，0 <= L < N，D <= 2000）。
    接下来的 D 行，每行有 4 个用空格隔开的整数。
      第 i 行的 4 个整数 Xi，Yi，Pi，Qi，表示坐在位置 (Xi，Yi) 与 (Pi，Qi) 的两个同学会交头接耳
       （输入保证他们前后相邻或者左右相邻）。
    输入数据保证最优方案的唯一性。
  输出
    输出文件 seat.out 共两行。
      第一行包含 K 个整数，a1，a2……aK，
        表示第 a1 行和 a1 + 1 行之间、第 a2 行和 a2 + 1 行之间、…、第 aK 行和第 aK + 1 行之间要开辟通道，
        其中 ai< ai+1，每两个整数之间用空格隔开（行尾没有空格）。
      第二行包含 L 个整数，b1，b2……bL，表示第 b1 列和 b1 + 1 列之间、第 b2 列和 b2 + 1 列之间、
        …、第 bL 列和第 bL + 1 列之间要开辟通道，其中 bi < bi+1，每两个整数之间用空格隔开（列尾没有空格）。
  样例输入
    4 5 1 2 3
    4 2 4 3
    2 3 3 3
    2 5 2 4
  样例输出
    2
    2 4
  提示
                     ║       ║
                     ║       ║
             ┌───┬───╫───┬───╫───┐
           4 │   │ * ║ * │   ║   │
             ├───┼───╫───┼───╫───┤
           3 │   │   ║ # │   ║   │
       ══════╪═══╪═══╬═══╪═══╬═══╪══════
           2 │   │   ║ # │ + ║ + │
             ├───┼───╫───┼───╫───┤
           1 │   │   ║   │   ║   │
             └───┴───╫───┴───╫───┘
               1   2 ║ 3   4 ║ 5
                     ║       ║

    上图中用符号 *、#、+ 标出了 3 对会交头接耳的学生的位置，
      图中 3 条粗线的位置表示通道，图示的通道划分方案是唯一的最佳方案。（NOIP2008年普及组复赛第 2 题）
*/

#include <bits/stdc++.h>

using namespace std;

struct str {
    int id;  // 当前行号或列号
    int num; // 如果在当前行或列建立通道, 能隔开几组交头接耳的同学
};

str h[2005] = {};  // 行
str l[2005] = {};  // 列

// 按 .num (能隔开的交头接耳的同学的组数) 从大到小的顺序进行排序
bool cmp(str a, str b) {
    return a.num > b.num;
}

// 按 .id (行号或列号) 从小到大的顺序进行排序
bool cmp2(str a, str b) {
    return a.id < b.id;
}

int main() {
    int m, n, k, L, d;
    int xi; // 中间变量

    cin >> m >> n  >> k >> L >> d;

    // 对 数组 h 和 l 进行初始化
    for (int i = 1; i <= m; i++) {
        h[i] = {i, 0};
    }
    for (int i = 1; i <= n; i++) {
        l[i] = {i, 0};
    }

    for (int i = 1; i <= d; i++) {
        int x, y, p, q;
        cin >> x >> y >> p >> q;
        if  (x == p) { // 这组表示的 2 个位置的行相同
            xi = min(y, q); // 在第 xi 列建立通道，能隔开这组交头接耳的同学
            l[xi].num++;
        } else { // 这组表示的 2 个位置的列相同
            xi = min(x, p); // 在第 xi 行建立通道，能隔开这组交头接耳的同学
            h[xi].num++;
        }
    }

    // 对 h[1] ~ h[m] 按 .num(能隔开的交头接耳的同学的组数) 从大到小的顺序进行排序
    sort(h + 1, h + m + 1, cmp);
    // 对 l[1] ~ l[n] 按 .num(能隔开的交头接耳的同学的组数) 从大到小的顺序进行排序
    sort(l + 1, l + n + 1, cmp);

    // 对 h[1] ~ h[k] 按 .id(行号) 从小到大的顺序进行排序
    sort(h + 1, h + k + 1, cmp2);
    // 对 l[1] ~ l[L] 按 .id(列号) 从小到大的顺序进行排序
    sort(l + 1, l + L + 1, cmp2);

    for (int i = 1; i <= k; i++) {
        cout << h[i].id << " ";
    }
    cout << endl;

    for (int i = 1; i <= L; i++) {
        cout << l[i].id << " ";
    }

    return 0;
}